import math


class Entropy():
    """
        计算目的ip的香农信息熵
        熵值越大，系统中混乱程度越大，越正常
        熵值越小，系统中混乱程度越小，越异常
    """

    def __init__(self):
        self.dst_ip_cnt = {}    # 目的ip当前出现的次数统计
        self.cnt = 0            # 统计到的流量条数，每统计20条流量计算一次熵值
        self.value = 1          # 当前系统的熵值

    """ 搜集流量 """
    def collect(self, dst_ip):
        self.cnt += 1

        if dst_ip not in self.dst_ip_cnt:
            self.dst_ip_cnt[dst_ip] = 1
        else:
            self.dst_ip_cnt[dst_ip] += 1

        # 如果收集到20条，更新value值
        if self.cnt == 20:
            self.update_value()
            self.dst_ip_cnt = {}
            self.cnt = 0


    """ 更新value值 """
    def update_value(self):
        entropy_lis = []
        for key, val in self.dst_ip_cnt.items():
            tmp = abs(val / self.cnt)
            entropy_lis.append(-tmp * math.log2(tmp))
        self.value = sum(entropy_lis)

